SPB Git

Repository Public

layout.tsx 2.4 KB 43 lines tsx

1import type { Metadata, Viewport } from "next";2import { Geist, Geist_Mono, Instrument_Serif } from "next/font/google";3import { notFound } from "next/navigation";4import type { ReactNode } from "react";5import "../globals.css";6import { Footer } from "@/components/layout/Footer";7import { Header } from "@/components/layout/Header";8import { site } from "@/lib/data";9import { getDict, isLocale, LOCALES } from "@/lib/i18n";1011const geist = Geist({ subsets: ["latin"], variable: "--font-geist", display: "swap" });12const geistMono = Geist_Mono({ subsets: ["latin"], variable: "--font-geist-mono", display: "swap" });13const display = Instrument_Serif({ subsets: ["latin"], weight: "400", style: ["italic"], variable: "--font-display", display: "swap" });1415export const dynamicParams = false;16export const generateStaticParams = () => LOCALES.map((locale) => ({ locale }));17export const viewport: Viewport = { themeColor: "#F6F7F9", colorScheme: "light", width: "device-width", initialScale: 1, viewportFit: "cover" };1819export async function generateMetadata({ params }: { params: Promise<{ locale: string }> }): Promise<Metadata> {20  const { locale } = await params;21  if (!isLocale(locale)) return {};22  const t = getDict(locale);23  return { metadataBase: new URL(site.url), title: { default: t.meta.home.title, template: `%s — MacLustr` }, applicationName: t.meta.siteName, robots: { index: true, follow: true } };24}2526export default async function LocaleLayout({ children, params }: { children: ReactNode; params: Promise<{ locale: string }> }) {27  const { locale } = await params;28  if (!isLocale(locale)) notFound();29  const t = getDict(locale);30  const jsonLd = { "@context": "https://schema.org", "@type": "WebSite", name: t.meta.siteName, url: `${site.url}/${locale}`, inLanguage: locale === "fr" ? "fr-CA" : "en", description: t.meta.home.description };31  return (32    <html lang={locale === "fr" ? "fr-CA" : "en"} className={`${geist.variable} ${geistMono.variable} ${display.variable}`}>33      <body className="min-h-dvh">34        <a href="#main" className="sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-4 focus:z-50 focus:rounded-full focus:bg-fg focus:px-4 focus:py-2 focus:text-white">{t.skip}</a>35        <Header locale={locale} />36        <main id="main">{children}</main>37        <Footer locale={locale} />38        <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />39      </body>40    </html>41  );42}43
Files main
Menu

Theme